# -*- coding: utf-8 -*-

"""
Created on 2021/5/25 19:36

@File: common_logging.py
@Author: LT
@Description: 让广大模块都要继承的一个日志类，而且只应该在主线程通过收到各子线程反馈的信息来对日志进行修改
              请！！！好好看这个日志是如何封装的！！！
              大体的思路是：日志可以设置多个句柄，每个句柄可以指向不同的处理对象，将不同的信息通过句柄写入到不同对象中
"""
import sys
import time
import logging
import os


class Logging(object):
    """封装后的logging"""
    def __init__(self, logger=None):
        """
        指定保存日志的文件路径，日志级别，以及调用文件
        将日志存入到指定的文件中
        后续可以记录每个线程的活动
        """

        # 第一步，创建一个logger
        self.logger = logging.getLogger(logger)         # 返回一个指定名称的日志，并在必要时创建它，如果没有指定名字，则会创建一个默认日志
        # 注意，这个指定名称的日志，并不是指日志文件的具体名字，可以说更像一个代号
        self.logger.setLevel(logging.DEBUG)             # 日志等级的总开关，是设置的最低阈值的开关，任何句柄的阈值都不能比它更低

        # 第二步，定义日志文件的目标文件名
        log_name = time.strftime('%Y-%m-%d', time.localtime(time.time()))        # 创建日志名称
        log_name += '.log'

        dir_name = os.path.dirname(__file__)
        log_dir = os.path.join(dir_name, 'Log')
        if not os.path.exists(log_dir):
            os.mkdir(log_dir)
        log_abs_name = os.path.join(log_dir, log_name)

        # 第三步，对已定义好的日志文件的目标文件名，创建一个handler，用于写入日志文件
        file_handler = logging.FileHandler(log_abs_name)
        file_handler.setLevel(logging.INFO)                     # 设置文件句柄的最低阈值

        # 再创建一个handler，用于输出到控制台
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.WARNING)               # 设置文件句柄的最低阈值

        # 第四步，定义handler的输出格式
        formatter_file = logging.Formatter(
            "[%(asctime)s] %(filename)s->%(funcName)s [line:%(lineno)d] - %(levelname)s: %(message)s")

        formatter_console = logging.Formatter(
            "[%(asctime)s] %(pathname)s->%(filename)s->%(funcName)s [line:%(lineno)d] - %(levelname)s: %(message)s")

        file_handler.setFormatter(formatter_file)
        console_handler.setFormatter(formatter_console)

        # 第五步，将logger添加到handler里面
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)

    def getlog(self):
        return self.logger


if __name__ == '__main__':
    log = Logging('demo').getlog()
    log.debug('start')
    log.warning('hihi')
    log.debug('end\n')
